Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System
Imports System.IO
Imports SendToVB


Public Class GeneradorReporte

    Private _url As String
    Private ultimoDocumento As Document

    Public Sub CrearReporteEstudiante(ByRef estudiante As Estudiante, ByRef grupo As Grupo)
        Dim reporte As New Document
        Dim nombreDoc As String = grupo.Curso.Nombre & estudiante.Carnet & "CorteNotas" & ".pdf"
        Try

            PdfWriter.GetInstance(reporte, New FileStream(nombreDoc, FileMode.Create))
            reporte.Open()
            'cargar imagen, deberia corregirse para no tener que tener la imagen en la carpeta bin
            Dim x As Microsoft.VisualBasic.ApplicationServices.AssemblyInfo = My.Application.Info
            Dim logo As Image = Image.GetInstance(x.DirectoryPath & "\logoCenfotecBlancoPeq.png")
            logo.Alignment = Image.ALIGN_LEFT
            reporte.Add(logo)

            'crear encabezado del pdf
            reporte.Add(New Paragraph(" "))

            Dim p1 As New Paragraph
            p1.Add(vbCrLf)
            p1.Add(New Phrase("Control de Notas"))
            p1.Add(New Phrase("                                                                                                            " & Date.Today))
            p1.Add(vbCrLf)
            p1.Add(New Phrase("Curso: " & grupo.Curso.Nombre & ", " & "Grupo No. " & grupo.NumeroGrupo))
            p1.Add(vbCrLf)
            p1.Add(New Phrase("Profesor(es):"))
            p1.Add(vbCrLf)
            For Each profesor As Profesor In grupo.Profesores
                p1.Add(New Phrase("   " & profesor.Nombre))
                p1.Add(vbCrLf)
            Next

            reporte.Add(p1)

            Dim notas As ComponenteEvaluacion
            notas = estudiante.Notas

            Dim nombreEst As String
            nombreEst = estudiante.Nombre & " " & estudiante.PrimerApellido & " " & estudiante.SegundoApellido

            'crear tabla de tamanio cantidad de rubros + nombre estudiante + nota
            Dim aTable As New PdfPTable(notas.ListaRubros.Count + 2)

            'Encabezado de la tabla
            aTable.AddCell("Nombre")
            For Each rubro As ComponenteEvaluacion In notas.ListaRubros
                aTable.AddCell(rubro.Nombre)
            Next
            aTable.AddCell("Nota")

            'llenar la tabla
            aTable.AddCell(nombreEst)
            For Each rubro As ComponenteEvaluacion In notas.ListaRubros
                aTable.AddCell(Math.Round(rubro.CalcularNota(), 2))
            Next
            aTable.AddCell(Math.Round(notas.CalcularNota(), 2))

            reporte.Add(New Paragraph(" "))
            reporte.Add(New Phrase("Corte de Notas"))
            reporte.Add(aTable)

            reporte.Add(New Paragraph(" "))
            reporte.Add(New Phrase("Desglose de Notas"))

            For Each rubro As ComponenteEvaluacion In notas.ListaRubros
                reporte.Add(New Paragraph(" "))
                reporte.Add(New Phrase(rubro.Nombre & ":"))
                Dim tabla As PdfPTable = Me.CrearTabla(rubro)
                reporte.Add(tabla)

            Next

        Catch deEx As DocumentException
            MsgBox(deEx.Message)

        Catch ioEx As IOException
            MsgBox(ioEx.Message)
        End Try

        reporte.Close()
        Me.ultimoDocumento = reporte

        Dim path As Microsoft.VisualBasic.ApplicationServices.AssemblyInfo = My.Application.Info
        Me._url = path.DirectoryPath & "\" & nombreDoc
    End Sub

    Private Function CrearTabla(ByVal rubro As ComponenteEvaluacion) As PdfPTable
        Dim tabla As New PdfPTable(rubro.ListaRubros.Count + 1)
        For Each r As ComponenteEvaluacion In rubro.ListaRubros
            tabla.AddCell(r.Nombre)
        Next
        tabla.AddCell("Promedio")

        For Each r As ComponenteEvaluacion In rubro.ListaRubros
            tabla.AddCell(Math.Round(r.CalcularNota(), 2))
        Next
        tabla.AddCell(Math.Round(rubro.CalcularPromedio(), 2))

        Return tabla
    End Function


    Public Function ObtenerUrlReporte(ByRef grupo As Grupo) As String
        Dim reporte As New Document
        Dim nombreDoc As String = grupo.Curso.Nombre & " " & grupo.Cuatrimestre & " " & ".pdf"
        Try

            PdfWriter.GetInstance(reporte, New FileStream(nombreDoc, FileMode.Create))
            reporte.Open()
            'cargar imagen, deberia corregirse para no tener que tener la imagen en la carpeta bin
            Dim x As Microsoft.VisualBasic.ApplicationServices.AssemblyInfo = My.Application.Info
            Dim logo As Image = Image.GetInstance(x.DirectoryPath & "\logoCenfotecBlancoPeq.png")
            logo.Alignment = Image.ALIGN_LEFT
            reporte.Add(logo)

            'crear encabezado del pdf
            reporte.Add(New Paragraph(" "))

            Dim p1 As New Paragraph
            p1.Add(vbCrLf)
            p1.Add(New Phrase("Reporte Final de Notas"))
            p1.Add(New Phrase("                                                                                             " & Date.Today))
            p1.Add(vbCrLf)
            p1.Add(New Phrase("Curso: " & grupo.Curso.Nombre & ", " & "Grupo No. " & grupo.NumeroGrupo))
            p1.Add(vbCrLf)
            p1.Add(New Phrase("Profesor(es):"))
            p1.Add(vbCrLf)
            For Each profesor As Profesor In grupo.Profesores
                p1.Add(New Phrase("   " & profesor.Nombre))
                p1.Add(vbCrLf)
            Next

            reporte.Add(p1)

            Dim tabla As New PdfPTable(grupo.PlanEvaluacion.ListaRubros.Count + 2)
            tabla.AddCell("Carnet")
            For Each rubro As ComponenteEvaluacion In grupo.PlanEvaluacion.ListaRubros
                tabla.AddCell(rubro.Nombre())
            Next
            tabla.AddCell("Promedio Final")

            For Each estudiante As Estudiante In grupo.ListaEstudiantes
                tabla.AddCell(estudiante.Carnet)
                For Each rubro As ComponenteEvaluacion In estudiante.Notas.ListaRubros
                    tabla.AddCell(Math.Round(rubro.CalcularNota(), 2))
                Next
                tabla.AddCell(Math.Round(estudiante.Notas.CalcularNota(), 2))
            Next

            reporte.Add(New Paragraph(" "))
            reporte.Add(New Phrase("Reporte Final de notas"))
            reporte.Add(tabla)


        Catch deEx As DocumentException
            MsgBox(deEx.Message)

        Catch ioEx As IOException
            MsgBox(ioEx.Message)
        End Try

        reporte.Close()

        Dim url As String
        Dim path As Microsoft.VisualBasic.ApplicationServices.AssemblyInfo = My.Application.Info
        url = path.DirectoryPath & "\" & nombreDoc
        Return url

    End Function

    Public ReadOnly Property URL() As String
        Get
            Return Me._url
        End Get
    End Property

    Public Sub EnviarReporte(ByRef estudiante As Estudiante, ByRef grupo As Grupo)
        Me.CrearReporteEstudiante(estudiante, grupo)
        Dim mapi As New SendFileTo.MAPI
        mapi.AddRecipientTo(estudiante.Mail)
        mapi.AddAttachment(Me.URL)
        Dim asunto As String = "Corte de notas" & " " & grupo.Curso.Nombre
        Dim mensaje As String = "Corte de notas" & " " & grupo.Curso.Nombre
        mapi.SendMailPopup(asunto, mensaje)

    End Sub



End Class
